package com.atguigu.reflect;

public class Demo03Constructor {

//    @Test
//    public void testNewInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//        // 测试目标：通过反射创建 Tiger 类的对象
//        // 1、获取 Tiger 类对应的 Class 对象
//        Class<?> tigerClass = Class.forName("com.atguigu.reflect.entity.Tiger");
//        System.out.println("tigerClass = " + tigerClass);
//
//        // 2、直接创建 Tiger 对象
//        // newInstance() 底层是调用目标类的无参构造器
//        // 如果目标类中没有无参构造器，那么会抛出异常
//        // 异常的核心信息是：java.lang.NoSuchMethodException: com.atguigu.reflect.entity.Tiger.<init>()
//        Object instance = tigerClass.newInstance();
//        System.out.println("instance = " + instance);
//        System.out.println(instance instanceof Tiger);
//    }
//
//    @Test
//    public void testGetConstructor() throws ClassNotFoundException {
//        // 测试目标：获取目标类的全部public权限的构造器
//        // 1、获取 Class 对象
//        Class<?> tigerClass = Class.forName("com.atguigu.reflect.entity.Tiger");
//
//        // 2、获取目标类的全部public权限的构造器
//        Constructor<?>[] constructors = tigerClass.getConstructors();
//
//        // 3、遍历
//        for (Constructor<?> constructor : constructors) {
//            System.out.println("constructor = " + constructor);
//        }
//    }
//
//    @Test
//    public void testGetDeclaredConstructors() throws ClassNotFoundException {
//        // 测试目标：获取目标类的全部构造器
//        // 1、获取 Class 对象
//        Class<?> tigerClass = Class.forName("com.atguigu.reflect.entity.Tiger");
//
//        // 2、获取目标类的全部构造器
//        Constructor<?>[] declaredConstructors = tigerClass.getDeclaredConstructors();
//
//        // 3、遍历
//        for (Constructor<?> declaredConstructor : declaredConstructors) {
//            System.out.println("declaredConstructor = " + declaredConstructor);
//        }
//    }
//
//    @Test
//    public void testGetSingleOneConstructor() throws ClassNotFoundException, NoSuchMethodException {
//        // 测试目标：精确获取某一个构造器
//        // 底层原理：一个类中可以重载很多个构造器，这些构造器之间通过不同的参数列表区分，所以获取时也通过不同参数列表精确的找到某一个构造器
//        // 1、获取 Class 对象
//        Class<?> tigerClass = Class.forName("com.atguigu.reflect.entity.Tiger");
//
//        // 2、根据不同参数列表精确的找到某一个构造器
//        // [1]获取无参的构造器
//        Constructor<?> constructorNoArg = tigerClass.getConstructor();
//        System.out.println("constructorNoArg = " + constructorNoArg);
//
//        // [2]获取三个参数的构造器
//        Constructor<?> constructorThreeArgs = tigerClass.getConstructor(int.class, String.class, double.class);
//        System.out.println("constructorThreeArgs = " + constructorThreeArgs);
//
//        // 指定参数列表时要注意参数的顺序必须和目标构造器参数顺序一致
//        // constructorThreeArgs = tigerClass.getConstructor(int.class, double.class, String.class);
//        // System.out.println("constructorThreeArgs = " + constructorThreeArgs);
//
//        // [3]获取两个参数的构造器
//        // 不带Declared：局限在public权限
//        // Constructor<?> constructorTwoArgs = tigerClass.getConstructor(int.class, String.class);
//        // System.out.println("constructorTwoArgs = " + constructorTwoArgs);
//
//        // 带着Declared：不局限于任何权限
//        Constructor<?> constructorTwoArgs = tigerClass.getDeclaredConstructor(int.class, String.class);
//        System.out.println("constructorTwoArgs = " + constructorTwoArgs);
//    }
//
//    @Test
//    public void testBuildObject() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        // 测试目标：调用 public 权限的构造器创建对象
//        // 1、无参构造器
//        Constructor<Tiger> constructorWithOutArgs = Tiger.class.getConstructor();
//        Tiger tiger01 = constructorWithOutArgs.newInstance();
//        System.out.println("tiger01 = " + tiger01);
//
//        // 2、有参构造器
//        Constructor<Tiger> constructorWithArgs = Tiger.class.getConstructor(int.class, String.class, double.class);
//        Tiger 完达山一号 = constructorWithArgs.newInstance(10, "完达山一号", 5000.00d);
//        System.out.println("完达山一号 = " + 完达山一号);
//
//    }
//
//    @Test
//    public void testBuildObjectByPrivate() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        // 测试目标：调用 private 权限构造器创建对象
//        Constructor<Tiger> declaredConstructor = Tiger.class.getDeclaredConstructor(int.class, String.class);
//
//        // 突破访问权限
//        declaredConstructor.setAccessible(true);
//
//        Tiger 小脑斧 = declaredConstructor.newInstance(8, "小脑斧");
//        System.out.println("小脑斧 = " + 小脑斧);
//    }

}
